package cn.cuilan.hutool.core;

import cn.hutool.core.date.*;

import java.util.Calendar;
import java.util.Date;

/**
 * 日期工具
 *
 * @author zhangyan
 * @since 2023/1/5
 */
public class DateUtilTest {

    /**
     * Date、long、Calendar之间的相互转换
     */
    private static void convert() {
        // 当前时间
        Date date1 = DateUtil.date();
        System.out.println(date1);
        Date date2 = DateUtil.date(Calendar.getInstance());
        System.out.println(date2);
        Date date3 = DateUtil.date(System.currentTimeMillis());
        System.out.println(date3);

        // 当前时间字符串，格式：yyyy-MM-dd HH:mm:ss
        String now = DateUtil.now();
        System.out.println(now);
        // 当前日期字符串，格式：yyyy-MM-dd
        String today = DateUtil.today();
        System.out.println(today);
    }

    /**
     * 字符串时间转日期
     */
    private static void string2Date() {
        String dateStr = "2023-01-05";
        // 自动识别格式
        Date date = DateUtil.parse(dateStr);
        System.out.println(date);

        // 自定义格式
        Date date2 = DateUtil.parse(dateStr, "yyyy-MM-dd");
        System.out.println(date2);
    }

    /**
     * 格式化日期输出
     */
    private static void format() {
        String dateStr = "2023-01-05";
        Date date = DateUtil.parse(dateStr);

        // //结果 2017/03/01
        String format = DateUtil.format(date, "yyyy/MM/dd");
        System.out.println(format);

        // 常用格式的格式化，结果：2017-03-01
        String formatDate = DateUtil.formatDate(date);
        System.out.println(formatDate);

        // 结果：2017-03-01 00:00:00
        String formatDateTime = DateUtil.formatDateTime(date);
        System.out.println(formatDateTime);

        // 结果：00:00:00
        String formatTime = DateUtil.formatTime(date);
        System.out.println(formatTime);
    }

    /**
     * 获取Date对象的某个部分
     */
    private static void getPart() {
        Date date = DateUtil.date();
        // 获得年的部分
        System.out.println(DateUtil.year(date));
        // 获得月份，从0开始计数
        System.out.println(DateUtil.month(date));
        // 获得月份枚举
        System.out.println(DateUtil.monthEnum(date));
        // 获得一月中的第N天
        System.out.println(DateUtil.dayOfMonth(date));
        // 获得一周中的第N天
        System.out.println(DateUtil.dayOfWeek(date));
        // 获得星期几
        System.out.println(DateUtil.dayOfWeekEnum(date));
        // 获得一年中的第N天
        System.out.println(DateUtil.dayOfYear(date));
    }

    /**
     * 开始和结束时间
     */
    private static void startAndEnd() {
        String dateStr = "2023-01-06 21:33:23";
        Date date = DateUtil.parse(dateStr);

        // 一天的开始，结果：2023-01-06 00:00:00
        Date beginOfDay = DateUtil.beginOfDay(date);
        System.out.println(beginOfDay);

        // 一天的结束，结果：2023-01-06 23:59:59
        Date endOfDay = DateUtil.endOfDay(date);
        System.out.println(endOfDay);

        // 一月的开始，结果：2023-01-01 00:00:00
        DateTime beginOfMonth = DateUtil.beginOfMonth(date);
        System.out.println(beginOfMonth);

        // 一月的开始，结果：2023-01-31 23:59:59
        DateTime endOfMonth = DateUtil.endOfMonth(date);
        System.out.println(endOfMonth);
    }

    /**
     * 日期时间偏移
     */
    private static void offsetDateTime() {
        String dateStr = "2023-01-06 11:19:58";
        Date date = DateUtil.parse(dateStr);

        // 结果：2023-01-08 11:19:58
        Date newDate = DateUtil.offset(date, DateField.DAY_OF_MONTH, 2);
        System.out.println(newDate);

        // 常用偏移，结果：2023-01-09 11:19:58
        DateTime newDate2 = DateUtil.offsetDay(date, 3);
        System.out.println(newDate2);

        // 常用偏移，结果：2023-01-06 08:19:58
        DateTime newDate3 = DateUtil.offsetHour(date, -3);
        System.out.println(newDate3);

        // 简化的偏移方法
        // 昨天
        Date yesterday = DateUtil.yesterday();
        System.out.println(yesterday);
        // 明天
        Date tomorrow = DateUtil.tomorrow();
        System.out.println(tomorrow);
        // 上周
        Date lastWeek = DateUtil.lastWeek();
        System.out.println(lastWeek);
        // 下周
        Date nextWeek = DateUtil.nextWeek();
        System.out.println(nextWeek);
        // 上个月
        Date lastMonth = DateUtil.lastMonth();
        System.out.println(lastMonth);
        // 下个月
        Date nextMonth = DateUtil.nextMonth();
        System.out.println(nextMonth);
    }

    /**
     * 计算日期时间差，格式化时间差
     */
    private static void calcTime() {
        String dateStr1 = "2023-01-04 22:33:23";
        Date date1 = DateUtil.parse(dateStr1);

        String dateStr2 = "2023-01-08 23:33:23";
        Date date2 = DateUtil.parse(dateStr2);

        long between = DateUtil.between(date1, date2, DateUnit.MS);
        System.out.println(between);

        // BetweenFormatter.Level.MILLISECOND 表示精确到毫秒
        String formatBetween = DateUtil.formatBetween(between, BetweenFormatter.Level.MILLISECOND);
        // 输出：4天1小时
        System.out.println(formatBetween);
    }

    /**
     * 星座和属相，其他
     */
    private static void others() {
        // 星座
        String zodiac = DateUtil.getZodiac(Month.JULY.getValue(), 13);
        System.out.println(zodiac);

        // 属相
        String chineseZodiac = DateUtil.getChineseZodiac(1993);
        System.out.println(chineseZodiac);

        // 年龄
        System.out.println(DateUtil.ageOfNow("1993-07-13"));

        // 是否闰年
        System.out.println(DateUtil.isLeapYear(2023));
    }

    public static void main(String[] args) {
        //convert();
        //string2Date();
        //format();
        //getPart();
        //startAndEnd();
        //offsetDateTime();
        //calcTime();
        //others();
    }

}
